home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / System / ps2m / ps2m.asm < prev    next >
Encoding:
Assembly Source File  |  2001-04-07  |  8.9 KB  |  629 lines

  1. ; $VER: 1.2 (07.04.01)
  2. ; COPYRIGHT (C) 2001 RDC SOFTWARE
  3. ; Distributed under GPL license - see gpl.txt
  4.  
  5. ; This is a part of ps2m package,
  6. ; you can obtain latest version at Aminet:
  7.  
  8. ; ftp://ftp.wustl.edu/pub/aminet/hard/hack/ps2m.lha
  9. ; ftp://ftp.wustl.edu/pub/aminet/hard/hack/ps2m.readme
  10.  
  11. ; Use picasm by Timo Rossi to compile.
  12. ; Amiga version of picasm is included in devpic package:
  13.  
  14. ; ftp://ftp.wustl.edu/pub/aminet/dev/cross/devpic.lha
  15. ; ftp://ftp.wustl.edu/pub/aminet/dev/cross/devpic.readme
  16.  
  17. ; For any questions: rdc@mindless.com
  18.  
  19.     device    pic16f876
  20.     include "16f876.i"
  21.     include    "macros.i"
  22.  
  23. WHEEL    equ    1
  24. TOWER    equ    1
  25. SPEED    equ    42        ;42 for 4MHz, 52 for 5MHz
  26.  
  27. ; ---------
  28. ; variables
  29. ; ---------
  30.  
  31.     org    0x20
  32.  
  33. memstart
  34. count        ds    1
  35. recvb        ds    1
  36. recvc        ds    1
  37. recvd        ds    2
  38. recvdt        ds    1
  39. sendata        ds    1
  40. sendetc        ds    1
  41. intw        ds    1
  42. ints        ds    1
  43. wdtp        ds    1
  44. wdtm        ds    2
  45. temp1        ds    1
  46. currbyte    ds    1
  47. xdif        ds    1
  48. ydif        ds    1
  49. xdir        ds    1
  50. ydir        ds    1
  51. xspeed        ds    2
  52. yspeed        ds    2
  53. xcount        ds    1
  54. ycount        ds    1
  55. xtemp        ds    1
  56. ytemp        ds    1
  57. flags        ds    1
  58.  
  59. byte1        ds    1
  60. byte2        ds    1
  61. byte3        ds    1
  62.         if    WHEEL
  63. byte4        ds    1
  64. zdif        ds    1
  65. zcount        ds    1
  66.         endif
  67.  
  68. mem_end        org    0x000
  69.  
  70. ; ---------------
  71. ; bit definitions
  72. ; ---------------
  73.  
  74. fpkt1        equ    0
  75. fpkt2        equ    1
  76. fpkt3        equ    2
  77. fbyte        equ    3
  78. fnores        equ    4
  79. fnofps        equ    5
  80.  
  81.     if    WHEEL
  82. fwheel    equ    6
  83.     endif
  84.  
  85.     if    TOWER
  86. fon    equ    7
  87.     endif
  88.  
  89. ; ----------------
  90. ; init PIC & mouse
  91. ; ----------------
  92.  
  93. start    clrf    INTCON
  94.     movlw    b'10000001'
  95.     option
  96.     goto    start_a
  97.  
  98. ; -----------------
  99. ; interrupt handler
  100. ; -----------------
  101.  
  102. int    local
  103.     bcf    INTCON,1
  104.     movwf    intw
  105.     swapfw    STATUS
  106.     movwf    ints
  107.     bcf    recvd+1,2
  108.     btfsc    PORTB,1
  109.     bsf    recvd+1,2
  110.     rrf    recvd+1
  111.     rrf    recvd
  112.     bsf    wdtp,5        ;clear packet bit shift watchdog
  113.     loop    =a,recvc
  114.     movlf    11,recvc
  115.     bsf    flags,fbyte
  116.     movff    recvd,recvdt
  117. =a    swapfw    ints
  118.     movwf    STATUS
  119.     swapf    intw
  120.     swapfw    intw
  121.     retfie
  122.     endlocal
  123.  
  124. ; ----------------------------
  125. ; init PIC & mouse - continued
  126. ; ----------------------------
  127.  
  128. start_a    local
  129.     movlf    0xff,0x1f
  130.     if    TOWER
  131.     clrf    PORTA
  132.     clrf    PORTB
  133.     movlw    b'11111111'
  134.     tris    PORTA
  135.     tris    PORTB
  136.     else
  137.     movlf    b'00011111',PORTA
  138.     movlf    b'00011100',PORTB
  139.     movlw    b'00000000'
  140.     tris    PORTA
  141.     movlw    b'11100011'
  142.     tris    PORTB
  143.     endif
  144.     endlocal
  145.  
  146. ; clear RAM
  147.  
  148.     movlf    memstart,FSR
  149.     sublw    mem_end
  150. clearam    clrf    INDF
  151.     incf    FSR
  152.     addlw    0xff
  153.     bnz    clearam
  154.     movlf    TRISB+0x80,FSR
  155.  
  156. ; init variables
  157.  
  158.     movlf    24,wdtm
  159.     movlf    11,recvc
  160.  
  161. ; delay before turn mouse on
  162.  
  163.     callw    delayms,0
  164.     if    TOWER        ;turn on mouse
  165.     movlw    b'00001111'
  166.     tris    PORTA
  167.     else
  168.     bcf    PORTA,4
  169.     endif
  170.     callw    delayms,100
  171.     movlw    b'00000001'    ;enable pull-up
  172.     option
  173.  
  174. ; wait for mouse
  175.  
  176.     local
  177.     callw    delayms,0
  178.     callw    delayms,0
  179.     callw    delayms,0
  180.     callw    delayms,0
  181.     callw    delayms,0
  182.     callw    delayms,0
  183.     callw    delayms,0
  184.     callw    delayms,0
  185.     callw    delayms,0
  186.     callw    delayms,0
  187.     bcf    INDF,0        ;inhibit I/O
  188.     bsf    INDF,1
  189.     callw    delayms,50
  190.     if    WHEEL
  191.     callw    send,0xf3    ;try to switch to wheel mode
  192.     callw    send,200
  193.     callw    send,0xf3
  194.     callw    send,100
  195.     callw    send,0xf3
  196.     callw    send,80
  197.     callw    send,0xF2    ;read mouse ID
  198.     call    bwait
  199.     sublw    3        ;intellimouse compatible?
  200.     skipnz
  201.     bsf    flags,fwheel    ;yes
  202.     endif
  203.     callw    send,0xe8    ;set resolution
  204.     callw    send,3        ;8/mm
  205.     callw    send,0xe6    ;scaling 1:1
  206.     callw    send,0xf3    ;set 200fps
  207.     callw    send,200
  208.     callw    send,0xf4    ;enable mouse in streaming mode
  209.     if    TOWER
  210.     call    cpoff
  211.     else
  212.     movlf    3,xtemp
  213.     movwf    ytemp
  214.     movlf    2,xcount
  215.     movwf    ycount
  216.     if    WHEEL
  217.     movwf    zcount
  218.     endif
  219.     endif
  220.     endlocal
  221.  
  222. ; -----------
  223. ; check mouse
  224. ; -----------
  225.  
  226. m_check    callw    send,0xE9
  227.     bc    start        ;no response? init mouse again
  228.     sublw    0xFA        ;ACK?
  229.     bnz    start        ;no ACK - init mouse again...
  230.     call    bwait        ;receive status byte
  231.     bc    start
  232.     andlw    b'01100000'    ;leave only stream & enable flags
  233.     sublw    b'00100000'    ;must be stream and enabled
  234.     bnz    start
  235.     btfsc    flags,fnores
  236.     goto    p_init
  237.     call    bwait        ;receive resolution (value ignored)
  238.     bc    nores        ;no resolution...
  239.     btfsc    flags,fnofps
  240.     goto    p_init
  241.     call    bwait        ;receive reports per second
  242.     bc    nofps        ;no fps
  243.     goto    p_init
  244.  
  245. ; no resolution & fps report
  246.  
  247. nores    bsf    flags,fnores
  248. nofps    bsf    flags,fnofps
  249.  
  250. ; ---------------------
  251. ; sync serial port init
  252. ; ---------------------
  253.  
  254. p_init    local
  255.     movlf    3,recvb
  256.     if    WHEEL
  257.     btfsc    flags,fwheel
  258.     incf    recvb
  259.     endif
  260.     clrf    currbyte
  261.     if    TOWER
  262.     movfw    INDF
  263.     xorfw    PORTB
  264.     andlw    b'00000100'
  265.     bz    =a
  266.     bcf    flags,fon    ;mouse off
  267.     movlw    b'00001111'    ;XxYy off
  268.     tris    PORTA
  269.     movlw    b'11111111'    ;buttons and wheel off
  270.     movwf    INDF
  271.     endif
  272. =a    bsf    INTCON,7    ;global interrupt enable
  273.     bsf    INTCON,4    ;enable RB0 interrupt
  274.     endlocal
  275.  
  276. ; check shift flag - byte received
  277.  
  278. schk    btfss    flags,fbyte
  279.     goto    pchk1
  280.     bcf    flags,fbyte
  281.     movfw    currbyte
  282.     addlw    byte1
  283.     movwf    FSR
  284.     movff    recvdt,INDF
  285.     movlf    PORTB+0x80,FSR
  286.     incf    currbyte
  287.     loop    tchk,recvb
  288.     movlf    3,recvb
  289.     if    WHEEL
  290.     btfsc    flags,fwheel
  291.     incf    recvb
  292.     endif
  293.     clrf    currbyte
  294.     bsf    flags,fpkt1
  295.     movlf    24,wdtm
  296.     goto    tchk
  297.  
  298. ; check packet flag - packet received
  299.  
  300. pchk1    btfss    flags,fpkt1
  301.     goto    pchk2
  302.     bcf    flags,fpkt1
  303.     bsf    flags,fpkt2
  304.     clrf    xdir
  305.     movlw    1
  306.     btfsc    byte1,4
  307.     movlw    255
  308.     movf    byte2
  309.     btfss    STATUS,Z
  310.     movwf    xdir
  311.     movfw    byte2
  312.     btfsc    byte1,4
  313.     sublw    0
  314.     addfw    xdif
  315.     btfsc    STATUS,C
  316.     movlw    255
  317.     movwf    xdif
  318.     movwf    xspeed
  319.     addwf    xspeed
  320.     skipc
  321.     addwf    xspeed
  322.     skipc
  323.     goto    tchk
  324.     movlf    255,xspeed
  325.     goto    tchk
  326.  
  327. pchk2    btfss    flags,fpkt2
  328.     goto    pchk3
  329.     bcf    flags,fpkt2
  330.     bsf    flags,fpkt3
  331.     clrf    ydir
  332.     movlw    1
  333.     btfsc    byte1,5
  334.     movlw    255
  335.     movf    byte3
  336.     btfss    STATUS,Z
  337.     movwf    ydir
  338.     movfw    byte3
  339.     btfsc    byte1,5
  340.     sublw    0
  341.     addfw    ydif
  342.     btfsc    STATUS,C
  343.     movlw    255
  344.     movwf    ydif
  345.     movwf    yspeed
  346.     addwf    yspeed
  347.     skipc
  348.     addwf    yspeed
  349.     skipc
  350.     goto    tchk
  351.     movlf    255,yspeed
  352.     goto    tchk
  353.  
  354. pchk3    btfss    flags,fpkt3
  355.     goto    tchk
  356.     bcf    flags,fpkt3
  357.     rlfw    byte1
  358.     movwf    temp1
  359.     rlf    temp1
  360.     comfw    temp1
  361.     andlw    b'00011100'
  362.     local
  363.     if    TOWER
  364.     movwf    temp1
  365.     sublw    b'00011100'
  366.     skipz
  367.     call    cpoff
  368.     btfss    flags,fon
  369.     goto    =a
  370.     if    WHEEL
  371.     movfw    INDF
  372.     andlw    b'11100011'
  373.     iorfw    temp1
  374.     else
  375.     movfw    temp1
  376.     iorlw    b'11100011'
  377.     endif
  378.     movwf    INDF
  379.     else
  380.     movwf    PORTB
  381.     endif
  382. =a    endlocal
  383.     if    WHEEL
  384.     movfw    byte4
  385.     btfsc    flags,fwheel
  386.     addwf    zdif
  387.     endif
  388.  
  389. ; check time to move
  390.  
  391. tchk    btfss    RTCC,7
  392.     goto    schk
  393.     sublf    SPEED,RTCC
  394.  
  395. ; CPU watchdog
  396.  
  397.     clrwdt
  398.  
  399. ; check mouse
  400.  
  401. mchk    loop    xchk,wdtm+1
  402.     loop    xchk,wdtm
  403.     movlf    24,wdtm
  404.     bcf    INTCON,4    ;disable RB0 interrupt
  405.     movfw    recvb
  406.     if    WHEEL
  407.     btfsc    flags,fwheel
  408.     addlw    255
  409.     endif
  410.     sublw    3        ;packet receive started?
  411.     btfss    STATUS,Z
  412.     goto    mchk_e        ;yes
  413.     movfw    recvc
  414.     sublw    11        ;byte receive started?
  415.     btfss    STATUS,Z
  416.     goto    mchk_e        ;yes
  417.     btfsc    PORTB,0        ;bit receive started?
  418.     goto    m_check        ;no
  419. mchk_e    bsf    INTCON,4    ;enable RB0 interrupt
  420.  
  421. ; check X movement
  422.  
  423. xchk    movfw    xspeed
  424.     addwf    xspeed+1
  425.     btfss    STATUS,C
  426.     goto    ychk
  427.     movf    xdif
  428.     btfsc    STATUS,Z
  429.     goto    ychk
  430.     decf    xdif
  431.     movfw    xdir
  432.     subwf    xcount
  433.     rrfw    xcount
  434.     andlw    1
  435.     xorfw    xcount
  436.     andlw    3
  437.     movwf    xtemp
  438.  
  439. ; check Y movement
  440.  
  441. ychk    movfw    yspeed
  442.     addwf    yspeed+1
  443.     btfss    STATUS,C
  444.     goto    zchk
  445.     movf    ydif
  446.     btfsc    STATUS,Z
  447.     goto    zchk
  448.     decf    ydif
  449.     movfw    ydir
  450.     addwf    ycount
  451.     rrfw    ycount
  452.     andlw    1
  453.     xorfw    ycount
  454.     andlw    3
  455.     movwf    ytemp
  456.  
  457. ; check wheel movement
  458.  
  459. zchk    local
  460.     if    WHEEL
  461.     btfsc    PORTB,5
  462.     goto    =a
  463. ;    if    BUTT4
  464. ;    btfss    INDF,5
  465. ;    goto    =a
  466. ;    endif
  467.     movlf    2,zcount
  468.     bsf    INDF,6
  469.     bsf    INDF,7
  470.     clrf    zdif
  471. =a    movf    zdif
  472.     bz    xyout
  473.     movlw    1
  474.     btfss    zdif,7
  475.     sublw    0
  476.     addwf    zdif
  477.     addwf    zcount
  478.     rrfw    zcount
  479.     andlw    1
  480.     xorfw    zcount
  481.     movwf    temp1
  482.     movfw    INDF
  483.     andlw    b'00111111'
  484.     btfsc    temp1,0
  485.     iorlw    b'01000000'
  486.     btfsc    temp1,1
  487.     iorlw    b'10000000'
  488.     if    TOWER
  489.     btfsc    flags,fon
  490.     endif
  491.     movwf    INDF
  492.     endif
  493.     endlocal
  494.  
  495. ; XY movement out
  496.  
  497. xyout    bcf    STATUS,C
  498.     rlfw    xtemp
  499.     addfw    xtemp
  500.     addfw    xtemp
  501.     iorfw    ytemp
  502.     if    TOWER
  503.     btfsc    flags,fon
  504.     tris    PORTA
  505.     else
  506.     movwf    PORTA
  507.     endif
  508.  
  509. ; packet bit shift watchdog
  510.  
  511. wchk    local
  512.     loop    schk,wdtp
  513.     bcf    INTCON,4    ;disable RB0 interrupt
  514.     movf    wdtp
  515.     btfss    STATUS,Z
  516.     goto    =a
  517.     movlf    11,recvc
  518.     bsf    wdtp,5
  519.     goto    p_init
  520. =a    bsf    INTCON,4    ;enable RB0 interrupt
  521.     goto    schk
  522.     endlocal
  523.  
  524. ; check power off for tower version
  525.  
  526.     if    TOWER
  527. cpoff    btfsc    flags,fon
  528.     return
  529.     comfw    PORTA
  530.     andlw    b'00001111'
  531.     btfsc    STATUS,Z
  532.     btfss    PORTB,2
  533.     return
  534.     bsf    flags,fon
  535.     movlf    3,xtemp
  536.     movwf    ytemp
  537.     movlf    2,xcount
  538.     movwf    ycount
  539.     if    WHEEL
  540.     movwf    zcount
  541.     endif
  542.     return
  543.     endif
  544.  
  545. ; ------------------
  546. ; send byte to mouse
  547. ; ------------------
  548.  
  549. send    local
  550.     clrf    INTCON
  551.     movwf    temp1
  552.     movwf    sendata
  553.     clrf    sendetc
  554.     comf    sendetc
  555.     bcf    INDF,0        ;inhibit I/O
  556.     callw    delayus,100
  557.     movlf    8,count
  558.     movlw    1
  559. =a    rrf    temp1        ;calculate parity
  560.     skipnc
  561.     xorwf    sendetc
  562.     loop    =a,count
  563.     movlf    11,count
  564.     bsf    INDF,0
  565.     bcf    INDF,1        ;initiate send
  566. =b    clrwdt
  567.     clrw
  568. =c    addlw    1
  569.     bz    start        ;timeout? reset mouse
  570.     btfsc    PORTB,0        ;wait for 0
  571.     goto    =c
  572.     rrf    sendetc
  573.     rrf    sendata
  574.     btfss    STATUS,C
  575.     bcf    INDF,1
  576.     btfsc    STATUS,C
  577.     bsf    INDF,1
  578.     clrw
  579. =d    addlw    1
  580.     btfsc    STATUS,Z    ;timeout?
  581.     goto    start        ;reset mouse
  582.     btfss    PORTB,0        ;wait for 1
  583.     goto    =d
  584.     loop    =b,count
  585.     clrf    INTCON
  586.     endlocal
  587.     ; to be continued
  588.  
  589. ; -----------------------
  590. ; receive byte from mouse
  591. ; -----------------------
  592.  
  593. bwait    local
  594.     bsf    INTCON,7    ;global interrupt enable
  595.     bsf    INTCON,4    ;enable RB0 interrupt
  596.     movlf    40,count
  597. =a    clrwdt
  598.     callw    delayus,100
  599.     btfss    flags,fbyte
  600.     goto    =b
  601.     bcf    flags,fbyte
  602.     movfw    recvdt
  603.     bcf    STATUS,C
  604.     return
  605. =b    loop    =a,count
  606.     setc
  607.     return
  608.     endlocal
  609.  
  610. ; ------
  611. ; delays
  612. ; ------
  613.  
  614. delayms    local
  615.     movwf    count
  616. =a    clrwdt
  617.     movlw    249
  618. =b    addlw    0xff
  619.     bnz    =b
  620.     loop    =a,count
  621.     return
  622.     endlocal
  623.  
  624. delayus    addlw    0xff
  625.     bnz    delayus
  626.     return
  627.  
  628.     end
  629.